Skip to content

Method: DoubleAttributenameCheck(Model, TaskExecutor)

1: package de.fhdw.wtf.walker.tasks;
2:
3: import java.util.HashSet;
4: import java.util.Set;
5:
6: import de.fhdw.wtf.common.ast.Attribute;
7: import de.fhdw.wtf.common.ast.ConstructorOrOperation;
8: import de.fhdw.wtf.common.ast.Group;
9: import de.fhdw.wtf.common.ast.Model;
10: import de.fhdw.wtf.common.ast.type.AtomicType;
11: import de.fhdw.wtf.common.ast.type.BaseType;
12: import de.fhdw.wtf.common.ast.type.ClassType;
13: import de.fhdw.wtf.common.ast.type.CompositeType;
14: import de.fhdw.wtf.common.ast.type.Type;
15: import de.fhdw.wtf.common.ast.type.TypeProxy;
16: import de.fhdw.wtf.common.ast.visitor.AtomicTypeVisitorException;
17: import de.fhdw.wtf.common.ast.visitor.TypeVisitorException;
18: import de.fhdw.wtf.common.exception.ast.ASTException;
19: import de.fhdw.wtf.common.exception.walker.DoubleAttributenameException;
20: import de.fhdw.wtf.common.exception.walker.TaskException;
21: import de.fhdw.wtf.common.task.TaskExecutor;
22: import de.fhdw.wtf.walker.walker.HelperUtils;
23: import de.fhdw.wtf.walker.walker.SimpleWalkerTask;
24:
25: /**
26: * This Task check the Attributenames in every Class and the superclasses. If there are duplicate Name of Attributes,
27: * this Checker will thrown an {@link DoubleAttributenameException}.
28: *
29: * This Checker must after the {@link CyclicInheritanceCheck} and the {@link BaseTypeInheritanceCheck}.
30: */
31: public final class DoubleAttributenameCheck extends SimpleWalkerTask {
32:         
33:         /**
34:          * Constructor of {@link DoubleAttributenameCheck}.
35:          *
36:          * @param m
37:          * model
38:          * @param taskmanager
39:          * taskmanager
40:          */
41:         private DoubleAttributenameCheck(final Model m, final TaskExecutor taskmanager) {
42:                 super(m, taskmanager);
43:         }
44:         
45:         /**
46:          * Creates a {@link DoubleAttributenameCheck}-Object.
47:          *
48:          * @param model
49:          * model
50:          * @param taskmanager
51:          * taskmanager
52:          * @return The {@link DoubleAttributenameCheck}-Object.
53:          */
54:         public static DoubleAttributenameCheck create(final Model model, final TaskExecutor taskmanager) {
55:                 return new DoubleAttributenameCheck(model, taskmanager);
56:         }
57:         
58:         @Override
59:         public void handleClass(final ClassType c) throws TaskException {
60:                 this.checkAttributeNames(c);
61:         }
62:         
63:         @Override
64:         public void handleGroup(final Group g) throws TaskException {
65:                 // Nothing
66:         }
67:         
68:         @Override
69:         public void handleAttribute(final Attribute a, final ClassType owner) throws TaskException {
70:                 // Nothing
71:         }
72:         
73:         /**
74:          * Check the attribute-Names of the class and the superclasses for double attributenames.
75:          *
76:          * @param clss
77:          * clss
78:          * @throws DoubleAttributenameException
79:          * DoubleAttributenameException
80:          */
81:         private void checkAttributeNames(final ClassType clss) throws DoubleAttributenameException {
82:                 this.checkAttributeNames(clss, new HashSet<String>());
83:         }
84:         
85:         /**
86:          * Check the attribute-Names of the class and the superclasses for double attributenames.
87:          *
88:          * @param clss
89:          * clss
90:          * @param attrNamen
91:          * already found attributenames
92:          * @throws DoubleAttributenameException
93:          * DoubleAttributenameException
94:          */
95:         void checkAttributeNames(final ClassType clss, final Set<String> attrNamen) throws DoubleAttributenameException {
96:                 for (final Attribute currentAttr : clss.getAttributes()) {
97:                         if (!attrNamen.add(currentAttr.getName())) {
98:                                 throw DoubleAttributenameException.create(currentAttr);
99:                         }
100:                 }
101:                 
102:                 /*for (final Type currentSupertype : clss.getSuperTypes()) {
103:                         currentSupertype.accept(new TypeVisitorException<DoubleAttributenameException>() {
104:                                 
105:                                 @Override
106:                                 public void handle(final TypeProxy typeProxy) throws DoubleAttributenameException {
107:                                         final Type targetType = HelperUtils.getTargetType(typeProxy);
108:                                         targetType.accept(new TypeVisitorException<DoubleAttributenameException>() {
109:                                                 
110:                                                 @Override
111:                                                 public void handle(final TypeProxy tP) {
112:                                                         throw new ASTException("It could not be a typeProxy in a typeProxy");
113:                                                 }
114:                                                 
115:                                                 @Override
116:                                                 public void handle(final CompositeType compositeType) {
117:                                                         // Nothing
118:                                                 }
119:                                                 
120:                                                 @Override
121:                                                 public void handle(final AtomicType atomicType) throws DoubleAttributenameException {
122:                                                         atomicType.accept(new AtomicTypeVisitorException<DoubleAttributenameException>() {
123:                                                                 
124:                                                                 @Override
125:                                                                 public void handle(final ClassType clazz) throws DoubleAttributenameException {
126:                                                                         DoubleAttributenameCheck.this.checkAttributeNames(clazz, attrNamen);
127:                                                                 }
128:                                                                 
129:                                                                 @Override
130:                                                                 public void handle(final BaseType baseType) {
131:                                                                         // Nothing
132:                                                                 }
133:                                                         });
134:                                                 }
135:                                         });
136:                                 }
137:                                 
138:                                 @Override
139:                                 public void handle(final CompositeType compositeType) {
140:                                         // Nothing
141:                                 }
142:                                 
143:                                 @Override
144:                                 public void handle(final AtomicType atomicType) {
145:                                         throw new ASTException("It´s could not be an atomic type direct");
146:                                 }
147:                         });
148:                 }*/
149:         }
150:         
151:         @Override
152:         public void finalizeTask() throws TaskException {
153:                 // Nothing
154:         }
155:         
156:         @Override
157:         public void beginTask() throws TaskException {
158:                 // Nothing to do here
159:         }
160:         
161:         @Override
162:         public void handleConstructorOrOperation(final ConstructorOrOperation coo, final ClassType owner)
163:                         throws TaskException {
164:                 // Nothing to do here
165:                 
166:         }
167: }